/**
 * 请求封装
 */
import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'

// 访问加载效果
let serverLoadingInstance = null

/**
 * 创建axios实例
 */
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分（这里与后端做了统一约定。前缀固定为/api）
    baseURL: '/api',
    // 超时
    timeout: 15000,
    redirect: 'manual'
})
/**
 * 请求拦截器
 */
service.interceptors.request.use(
    async config => {
        if (config.loading) {
            serverLoadingInstance = ElLoading.service({
                background: 'rgba(215, 230, 255,1)',
                customClass: 'server-loading',
                text: '努力加载中...'
            })
        }
        return config
    },
    error => {
        Promise.reject(error)
    }
)

/**
 * 响应拦截器
 */
service.interceptors.response.use(
    res => {
        serverLoadingInstance && serverLoadingInstance.close()
        // 未设置状态码则默认成功状态
        const code = res.data.code || 0
        if (code == 0) {
            return res.data
        }  else {
            ElMessage.closeAll()
            ElMessage({
                message: res.data.msg,
                type: 'error',
                showClose: true
            })
            return Promise.reject(new Error(res.data.msg))
        }
    },
    error => {
        let { message } = error
        if (message === 'Network Error') {
            message = '后端接口连接异常'
        } else if (message.includes('timeout')) {
            message = '系统接口请求超时'
        } else if (message.includes('Request failed with status code')) {
            message = `系统接口${message.substr(message.length - 3)}异常`
        }
        ElMessage.closeAll()
        ElMessage({
            message,
            type: 'error',
            duration: 2 * 1000,
            showClose: true
        })
        return Promise.reject(error)
    }
)

/**
 * 通用post方法
 * @param {Object} params
 * @returns
 */
export function post(params) {
    return service.post(params.url, params.params, {
        headers: Object.assign(
            {
                // 自定义请求头
                'Content-Type': (params.headers && params.headers.contentType) || 'application/json'
            },
            params.headers
        ),
        // 是否有加载效果
        loading: params.loading
    })
}

/**
 * 通用get方法
 * @param {*} params
 * @returns
 */
export function get(params) {
    return service.get(params.url, {
        params: params.params,
        // 自定义请求头
        headers: Object.assign(
            {
                // 自定义请求头
                'Content-Type': (params.headers && params.headers.contentType) || 'application/json'
            },
            params.headers
        ),
        // 是否有加载效果
        loading: params.loading
    })
}
